// 在 TS 中 如果没有明确指出变量的类型，类型推论会自动根据表达式来推论该变量的类型
let str = '1';
// str = 2; 此时就无法给 str 复制 数字，因为它已经被推论为 字符串

// 最佳通用类型
class Animal { }

class Rhino extends Animal {
  public constructor() {
    super()
  }
}
class Elephant extends Animal {
  public constructor() {
    super()
  }
}
class Snake extends Animal {
  public constructor() {
    super()
  }
}

let animals = [new Rhino(), new Elephant(), new Snake()];
// 此时 animals 就被推论为 Animal 类型的数组
// 如果没有这个公共的 父类，animals 就会被推论为 联合数组类型 (Rhino|Elephant|Snake)[]

// 上下文类型推论 自动根据上下文环境来推论数据类型
window.onmousedown = function (mouseEvent): void {
  console.log(mouseEvent.button);
  // 这里 mouseEvent 就被推论为 鼠标事件 
  // 若手动定义了 mouseEvent 的类型 那就会忽略上下文推论
}